//=======================================Copyright(c)===========================================
// 								  深圳易马达科技有限公司
//---------------------------------------文件信息----------------------------------------------
//文件名   	: MX25L16.h
//创建人  	: Handry
//创建日期	: 
//描述	    : MX25L16驱动头文件
//-----------------------------------------------当前版本修订----------------------------------
//修改人   	:
//版本	    :
//修改日期	:
//描述	    :
//=============================================================================================
#ifndef MX25L16_H_
#define MX25L16_H_

//=============================================================================================
//头文件
//=============================================================================================
//#include "BSPSPI.h"
//#include "BSPGPIO.h"
#include "BSPTypeDef.h"
#include "BSP_GPIO.h"


//=============================================================================================
//宏参数设定
//=============================================================================================
//#define 	FLASH_CS_PORT 			LPSPI1_CS_PORT		//SPI FLASH 片选引脚
//#define 	FLASH_CS_PIN 			LPSPI1_CS_PIN
#define 	FLASH_CLK_PORT 			LPSPI1_SCK_PORT		//SPI FLASH CLK引脚
#define 	FLASH_CLK_PIN 			LPSPI1_SCK_PIN
#define 	FLASH_MOSI_PORT 		LPSPI1_MISO_PORT	//SPI FLASH MOSI引脚
#define 	FLASH_MOSI_PIN 			LPSPI1_MISO_PIN
#define 	FLASH_MISO_PORT 		LPSPI1_MOSI_PORT	//SPI FLASH MISO引脚
#define 	FLASH_MISO_PIN 			LPSPI1_MOSI_PIN

//#define		FLASH_SPI_CHN			eSPI1	//FLASH SPI通信通道
#define		FLASH_SPI_CHN				SPI1	//FLASH SPI通信通道

#define 	FLASH_MAX_SECTOR 		512		//MX25L16最大扇区数目	1扇区 = 4k bytes
#define 	FLASH_MAX_BLOKC 		32		//MX25L16最大块数目		1块 = 64k bytes

#define		FLASH_DEV_ID				0xC214	//芯片设备ID

//指令表宏定义
#define 	M25L_WRITESTATUS		0X01
#define 	M25L_PAGEPROGRAM		0X02
#define 	M25L_READDATA			0X03
#define 	M25L_WRITEDISABLE		0X04
#define 	M25L_READSTATUS			0X05
#define 	M25L_WRITEENABLE		0X06
#define		M25L_FASTREADDATA		0X0B
#define 	M25L_FASTREADDUAL		0X3B
#define 	M25L_BLOCKERASE			0XD8
#define 	M25L_SECTORERASE		0X20
#define 	M25L_CHIPERASE			0XC7
#define 	M25L_POWERDOWN			0XB9
#define 	M25L_RELEASEPOWERDOWN	0XAB
#define 	M25L_DEVICEID			0XAB
#define 	M25L_MANUFACTDEVICEID	0X90
#define 	M25L_JEDECDEVICEID		0X9F



//#define		FLASH_PWR_ON			BSPGPIOClrPin(FLASH_POWER_PORT,FLASH_POWER_PIN);		//拉低为ON
//#define		FLASH_PWR_OFF			BSPGPIOSetPin(FLASH_POWER_PORT,FLASH_POWER_PIN);		//拉高为OFF

#define		FLASH_PWR_ON			HAL_GPIO_WritePin(FLASH_POW_EN_PORT, FLASH_POW_EN_PIN, GPIO_PIN_RESET);	//拉低为ON
#define		FLASH_PWR_OFF			HAL_GPIO_WritePin(FLASH_POW_EN_PORT, FLASH_POW_EN_PIN, GPIO_PIN_SET);		//拉高为OFF

#define 	FLASH_CS_ENABLE		HAL_GPIO_WritePin(FLASH_CS_PORT, FLASH_CS_PIN, GPIO_PIN_RESET);					//拉低为选中
#define 	FLASH_CS_DISABLE	HAL_GPIO_WritePin(FLASH_CS_PORT, FLASH_CS_PIN, GPIO_PIN_SET);						//拉高取消

//=============================================================================================
//静态函数声明
//=============================================================================================
//=============================================================================================
//函数名称	: static __INLINE void MX25L16CSHigh(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: FLASH片选拉高，失能
//注    意	:
//=============================================================================================
static inline void MX25L16CSHigh(void)
{
//	BSPGPIOSetPin(FLASH_CS_PORT,FLASH_CS_PIN);
	HAL_GPIO_WritePin(FLASH_CS_PORT, FLASH_CS_PIN, GPIO_PIN_SET);						//拉高取消
}

//=============================================================================================
//函数名称	: static __INLINE void MX25L16CSLow(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: FLASH片选拉低，使能
//注    意	:
//=============================================================================================
static inline void MX25L16CSLow(void)
{
//	BSPGPIOClrPin(FLASH_CS_PORT,FLASH_CS_PIN);   
	HAL_GPIO_WritePin(FLASH_CS_PORT, FLASH_CS_PIN, GPIO_PIN_RESET);					//拉低为选中	
}

//=============================================================================================
//声明变量，供外部使用
//=============================================================================================
extern u8 gFlashErr;						//flash芯片故障

//=============================================================================================
//声明接口函数
//=============================================================================================
//=============================================================================================
//函数名称	: void MX25L16Init(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: M25L16初始化函数
//注    意	:
//=============================================================================================
void MX25L16Init(void);

//=============================================================================================
//函数名称	: void MX25L16FaultTest(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: M25L16错误检测
//注    意	:
//=============================================================================================
void MX25L16FaultCheck(void);

//=============================================================================================
//函数名称	: u16 MX25L16ReadDevID(void)
//函数参数	:
//输出参数	: ID
//静态变量	:
//功    能	: 读取设备ID函数
//注    意	:
//=============================================================================================
u16 MX25L16ReadDevID(void);

//=============================================================================================
//函数名称	: u8 MX25L16CheckBusy(void)
//函数参数	:
//输出参数	: 1：FLASH忙；0：FLASH空闲
//静态变量	:
//功    能	: flash全片擦除
//注    意	:
//=============================================================================================
u8 MX25L16CheckBusy(void);

//=============================================================================================
//函数名称	: u8 MX25L16ReadStatus(void)
//函数参数	:
//输出参数	: 状态寄存器的值
//静态变量	:
//功    能	: 读取状态寄存器
//注    意	:
//=============================================================================================
u8 MX25L16ReadStatus(void);

//=============================================================================================
//函数名称	: void MX25L16WriteStatus(u8 sr)
//函数参数	: 写状态寄存器的值
//输出参数	:
//静态变量	:
//功    能	: 读取状态寄存器
//注    意	:
//=============================================================================================
void MX25L16WriteStatus(u8 sr);

//=============================================================================================
//函数名称	: void  MX25L16WriteEnable(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: 去除FLASH写保护
//注    意	:
//=============================================================================================
void  MX25L16WriteEnable(void);

//=============================================================================================
//函数名称	: void  MX25L16WriteDisable(void)
//函数参数	:
//输出参数	:
//静态变量	:
//功    能	: FLASH写保护
//注    意	:
//=============================================================================================
void  MX25L16WriteDisable(void);

//=============================================================================================
//函数名称	: void MX25L16ReadData(u32 addr,u8 * readbuf,u32 len)
//函数参数	: addr:读地址
//			  readbuf:读取的数组地址
//			  len:读取的长度
//输出参数	:
//静态变量	:
//功    能	: 读取flash存储的数据
//注    意	:
//=============================================================================================
void MX25L16ReadData(u32 addr,u8 * readbuf,u32 len);

//=============================================================================================
//函数名称	: void MX25L16ReadData(u32 addr,u8 * readbuf,u32 len)
//函数参数	: pageaddr:写页地址
//			  writebuf:写入的数组地址
//			  len:写入的长度
//输出参数	:
//静态变量	:
//功    能	: flash存储页编程
//注    意	:
//=============================================================================================
void MX25L16WritePage(u32 pageaddr,u8 *writebuf,u32 len);

//=============================================================================================
//函数名称	: u8 MX25L16EraseSector(u32 secaddr)
//函数参数	: secaddr:扇区地址
//输出参数	: 1：扇区擦除成功；0：扇区擦除失败
//静态变量	:
//功    能	: flash扇区擦除
//注    意	:
//=============================================================================================
u8 MX25L16EraseSector(u32 secaddr);

//=============================================================================================
//函数名称	: u8 MX25L16EraseBlock(u32 blockaddr)
//函数参数	: blockaddr:块地址
//输出参数	: 1：块擦除成功；0：块擦除失败
//静态变量	:
//功    能	: flash块擦除
//注    意	:
//=============================================================================================
u8 MX25L16EraseBlock(u32 blockaddr);

//=============================================================================================
//函数名称	: u8 MX25L16EraseChip(void)
//函数参数	:
//输出参数	: 1：全片擦除成功；0：全片擦除失败
//静态变量	:
//功    能	: flash全片擦除
//注    意	:
//=============================================================================================
u8 MX25L16EraseChip(void);

#endif

/*****************************************end of MX25L16.*****************************************/
